//
//  HomeTableViewController.swift
//  SinaWeiBoProject
//
//  Created by 房城鸿 on 15/10/5.
//  Copyright © 2015年 房兰峰. All rights reserved.
//

import UIKit
import SVProgressHUD

class HomeTableViewController: BaseTableViewController {
    
    private var statusListViewModel = StatusListViewModel()
    private var photoBrowserAnimator = PhotoBrowserAnimation()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        if !UserAccountViewModel.sharedUserAccount.userLogin{
            visitorView?.setupInfo(nil, message: "关注一些人，会这里看看有什么惊喜")
            return
        }
        // 接收通知
        /**
        1.通知 “名”
        2.对象，监听“发送通知” 的对象，如果是nil,监听所有发送该通知的对象
        3.队列，调度 block 的队列，如果是 nil ，在主线程调度 block 执行
        4.block : 接收到通知执行的方法
        
        目前 IOS  开发中，更多的人喜欢用 block ，所有的代码写在一起 ！
        使用 通知的block 有陷进，只要使用self ，一定会循环引用 !
        */
        NSNotificationCenter.defaultCenter().addObserverForName(HMStatusPictureViewSelectedPhotoNotification, object: nil, queue: nil) { [weak self](notification) -> Void in

            guard let urls = notification.userInfo![HMStatusPictureViewSelectedPhotoURLsKey] as? [NSURL] else{
                return
            }
            guard let indexPath = notification.userInfo![HMStatusPictureViewSelectedPhotoIndexPath] as? NSIndexPath else{
                return
            }
            
            //获取图片视图的对象
            guard let picView = notification.object as? StatusPictureView else{
                return
            }
            
            //Model展现，默认会将上级视图移除
            let vc = PhotoBrowserViewController(urls: urls, indexPath: indexPath)

            //1.指定动画的提供者 transitioning - 转场，从一个界面跳转到 另一个界面的动画效果
            vc.transitioningDelegate = self?.photoBrowserAnimator
            
            //2.指定 modal展现样式是自动那个一的
            vc.modalPresentationStyle = UIModalPresentationStyle.Custom
            
            //计算位置：
            let fromRect = picView.screenRect(indexPath)
            let toRect = picView.fullScreenRect(indexPath)
            
            self?.photoBrowserAnimator.prepareAnimation(fromRect, toRect: toRect, url: urls[indexPath.item])
            
            self?.presentViewController(vc, animated: true, completion: nil)
        }
        
        prepareTableView()
        loadData()
    }
    
    deinit{
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    func prepareTableView(){
        // 注册可重用cell
        self.tableView.registerClass(StatusForwardCell.self, forCellReuseIdentifier: HMStatusForWardCellID)
        self.tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: HMNormalViewCellID)
        
        // 以下两句就可以自动处理行高 ，条件:
        // 提示，如果不是呀 自动计算行高 UITableViewAutomaticDimension  一定不要设置底部约束
        tableView.estimatedRowHeight = 200
        //tableView.rowHeight = 300
        //取消分割线
        tableView.separatorStyle  = UITableViewCellSeparatorStyle.None
        
        // 准备下拉刷新控件  -- 刷新空间的高度 是 60 点
        refreshControl = HMRefreshControl()
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
        // 上拉提示 
//        pullupView.startAnimating()
        tableView.tableFooterView = pullupView
    }
    

    
    //MARK: - 加载数据
    func loadData(){
        
        // beginRefreshing 只会播放刷新动画，不会加载数据
        refreshControl?.beginRefreshing()
        statusListViewModel.loadStatus(isPullupRefrsh: pullupView.isAnimating()).subscribeNext({ (result) -> Void in
            
            // 注意， result 的类型是A奴役Object 类型的，所以不能直接使用，
            // 使用RAC 传递的数值，是 以 NSNumber 的形式传递的
            let count  = (result as! NSNumber).integerValue
            self.showPullowTips(count)
            
            self.endLoadData()
            
            SVProgressHUD.showInfoWithStatus("您的网络不给力")

            }, error: { (error) -> Void in
                
            }) { () -> Void in

                self.endLoadData()
                // 刷新表格
                self.tableView.reloadData()
        }
    }
    
    ///  显示下拉刷新提示
    ///
    ///  - parameter count: 下拉的条数
    /// 提示： NavBar , TabBar ,ToolBar 不能使用自动布局
    /// 不要疯狂下拉刷新， 一旦 403 可以更换App ID
    private func showPullowTips(count:Int){
        
        let title = count == 0 ? "没有新微博" : "新刷新\(count)条微博"
        let height: CGFloat = 44
        let rect = CGRect(x: 0, y: -2 * height, width: UIScreen.mainScreen().bounds.width, height: height)
        
        pulldownTiplabel.frame = rect
        pulldownTiplabel.text = title
        
        UIView.animateWithDuration(1.2, animations: { () -> Void in
            self.pulldownTiplabel.frame = CGRectOffset(rect, 0, 3 * height)
            
            }) { (_) -> Void in
                UIView.animateWithDuration(1.2){self.pulldownTiplabel.frame = rect}
        }
    }
    
    private func endLoadData(){
        
        // 关闭刷新控件
        self.refreshControl?.endRefreshing()
        // 关闭上拉刷新动画
        self.pullupView.stopAnimating()
    }
    
    
    //MARK: - 上拉视图
    
    // 下拉刷新
    private lazy var pulldownTiplabel:UILabel = {
        
        let label: UILabel = UILabel(title: nil, color: UIColor.whiteColor(), fonSize: 18)
        label.backgroundColor = UIColor.orangeColor()
        label.textAlignment = NSTextAlignment.Center
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        return label
        
    }()
    
    // 上拉视图
    private lazy var pullupView:UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        indicator.color = UIColor.darkGrayColor()
        return indicator
        }()
    
}

// 类似于 OC 的匪类，同时可以将遵守的协议方法大，分离出来
extension HomeTableViewController{

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.statusListViewModel.status.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let viewModel = statusListViewModel.status[indexPath.row]
        /*
        1.
        dequeueReusableCellWithIdentifier: indexpath --一定会返回一个cell,必须注册可重用cell
        注册: registerClass/registerNib(XIB) 在SB 中制定
        如果缓冲区cell  不存在，会使用原型cell 实例化一个新的cell
        2.
        dequeueReusableCellWithIdentifier  ,会查询可重用cell ,如果注册 原型cell  ,能够查询到，否则，返回 nil
        需要后续判断 if (cell == nil) .是在 ios 5.0 开发使用的
        */
        let cell = tableView.dequeueReusableCellWithIdentifier(viewModel.cellID, forIndexPath: indexPath) as! StatusCell
        
        //获取微博数据
        
        cell.statusViewModel = viewModel
        return cell;
    }
    
    /**
    默认情况下，会计算多有行的行高，原因 ：UITableView 继承自 UIScrollerView
    UIscrollreView 的滚动依赖于 contenSize  ---> 把所有行高计算出来， 才能准确的知道 contentSize
    如果设置了预估行高，会根据预估行高，来计算需要显示行的尺寸
    
    提示： 如果行高是固定的，千万不要实现此代理方法，行高的代理方法，在每个版本的 Xcode 和 ios  模拟器上执行的效率都不一样 
    苹果在底层一直在左优化
    */
    // 计算每个cell 的行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
//         printLog("返回缓存行高")
        
        //0. 获得模型
        let viewModel = statusListViewModel.status[indexPath.row]
        
        // 1.判断视图模型的行高 是否为 0，如果不为 0.表示行高已经缓存
        if viewModel.rowHeight > 0{
        
            return viewModel.rowHeight
        }
        
        //2. 获得 cell  ，不能使用indexPath  的方法，否则会出现死循环
        let cell = tableView.dequeueReusableCellWithIdentifier(viewModel.cellID) as! StatusCell
        
        // 3. 记录行高 
        viewModel.rowHeight = cell.rowHeight(viewModel)
        
        // 4. 判断当前的indexpath  是否是数组的最后一项
        if (indexPath.row == statusListViewModel.status.count - 1) && !pullupView.isAnimating(){
        
            printLog("显示上拉视图")
            pullupView.startAnimating()
            
            // 开始刷新数据
            loadData()
        }
        
        //5. 返回行高
        return viewModel.rowHeight
    }
}


